package com.mowh.multithreading.guarded.suspension;

import java.util.LinkedList;
import java.util.Queue;

/**
 * @author mowh1gd
 * @create 2023/11/14 14:33
 */
public class RequestQueue { //扮演GuardedObject角色
    private final Queue<Request> queue = new LinkedList<>(); //扮演GuardedObject角色的state，而queue.peek()!=null是守护条件。
    public synchronized Request getRequest() { //扮演GuardedObject角色的guardedMethod
        while (queue.peek() == null) { //不满足守护条件，则wait等待，进入RequestQueue实例的队列，并释放实例锁。
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        return queue.remove();//满足守护条件，则获取请求并删除（队列的操作）。
    }
    public synchronized void putRequest(Request request) { //扮演GuardedObject角色的stateChangingMethod
        queue.offer(request);
        notifyAll(); //唤醒RequestQueue实例队列中的线程，并竞争获取实例锁。
    }
}
